﻿using DimensionsHelper.Common.Contracts.Excel.Options;

namespace DimensionsHelper.Common.Contracts.Excel;

/// <summary>
///     此接口表示允许读取和修改Excel单元格区域的工具类
/// </summary>
public interface IExcelRangeOperator
{
    /// <summary>
    ///     单元格所在工作表
    /// </summary>
    IExcelWorksheetOperator Worksheet { get; }

    /// <summary>
    ///     区域起始行
    /// </summary>
    int StartRow { get; }

    /// <summary>
    ///     区域结束行
    /// </summary>
    int EndRow { get; }

    /// <summary>
    ///     区域起始列
    /// </summary>
    int StartColumn { get; }

    /// <summary>
    ///     区域结束列
    /// </summary>
    int EndColumn { get; }

    /// <summary>
    ///     获取或设置当前单元格的值。
    /// </summary>
    object Value { get; set; }

    /// <summary>
    ///     获取当前单元格的字符串内容。
    /// </summary>
    string Text { get; }

    /// <summary>
    ///     当前单元格地址。
    /// </summary>
    string Address { get; }

    /// <summary>
    ///     当前单元格的全限定地址。
    /// </summary>
    string FullAddress { get; }

    /// <summary>
    ///     当前单元格的全限定绝对地址。
    /// </summary>
    string FullAddressAbsolute { get; }

    /// <summary>
    ///     获取或修改当前单元格的数字格式。
    /// </summary>
    string NumberFormatLocal { get; set; }

    /// <summary>
    ///     获取或设置当前单元格区域文字是否自动换行。
    /// </summary>
    bool WrapText { get; set; }

    /// <summary>
    ///     获取或设置当前单元格的文字大小。
    /// </summary>
    float FontSize { get; set; }

    /// <summary>
    ///     当前区域的字体样式。
    /// </summary>
    FontType FontStyle { get; set; }

    /// <summary>
    ///     当前区域的文字颜色，如果未设置，应当返回或设置<see cref="ExcelStyleColor.Empty" />。
    /// </summary>
    ExcelStyleColor FontColor { get; set; }

    /// <summary>
    ///     当前区域的背景颜色，如果未设置，应当返回或设置<see cref="ExcelStyleColor.Empty" />。
    /// </summary>
    ExcelStyleColor BackgroundColor { get; set; }

    /// <summary>
    /// 获取或设置当前单元格的注释文本。
    /// </summary>
    string? Comment { get; set; }

    /// <summary>
    ///     设置单元格的样式。
    /// </summary>
    /// <param name="styleOptionsParam"></param>
    IExcelRangeOperator SetStyle(RangeStyleOptions styleOptionsParam);

    /// <summary>
    ///     设置单元格的字体样式。
    /// </summary>
    /// <param name="param"></param>
    IExcelRangeOperator SetRangeFontStyle(FontStyleOptions param);

    /// <summary>
    ///     设置除了字体样式以外的其他样式。
    /// </summary>
    /// <param name="styleOptions"></param>
    IExcelRangeOperator SetRangeStyleExceptFontStyle(RangeStyleOptions styleOptions);

    /// <summary>
    ///     设置单元格的边框样式。
    /// </summary>
    /// <param name="borderPosition">边框位置</param>
    /// <param name="borderStyle">边框样式</param>
    IExcelRangeOperator SetRangeBorderStyle(BorderPosition borderPosition, BorderStyle borderStyle);

    /// <summary>
    ///     设置边框颜色
    /// </summary>
    /// <param name="borderPosition">边框位置</param>
    /// <param name="borderStyle">边框样式</param>
    /// <param name="borderColor">边框颜色</param>
    IExcelRangeOperator SetRangeBorderColor(BorderPosition borderPosition, BorderStyle borderStyle, ExcelStyleColor borderColor);

    /// <summary>
    ///     设置指定位置的边框颜色
    /// </summary>
    /// <param name="borderLocation">边框位置</param>
    /// <param name="borderStyle">边框样式</param>
    /// <param name="borderColor">边框颜色</param>
    IExcelRangeOperator SetRangeBorderColor(ExcelBorderLocation borderLocation, BorderStyle borderStyle, ExcelStyleColor borderColor);

    /// <summary>
    ///     获取指定位置的边框的已有样式。
    /// </summary>
    /// <param name="borderLocation">边框位置</param>
    /// <returns>指定边框位置的当前样式</returns>
    ExcelBorderState GetRangeBorderState(ExcelBorderLocation borderLocation);

    /// <summary>
    ///     合并单元格。
    /// </summary>
    void Merge();

    /// <summary>
    ///     向单元格末尾添加带有格式富文本内容。
    /// </summary>
    /// <param name="text"></param>
    /// <param name="fontStyleOptionsParam"></param>
    IExcelRangeOperator AppendRichText(string text, FontStyleOptions fontStyleOptionsParam);

    /// <summary>
    ///     判定区域内的所有单元格是否都为空白。
    /// </summary>
    /// <returns></returns>
    bool IsEmpty();

    /// <summary>
    ///     设置此单元格到目标单元格的超链接，Display为当前单元格已有内容。
    /// </summary>
    /// <param name="target">目标单元格</param>
    IExcelRangeOperator SetHyperlink(IExcelRangeOperator target);

    /// <summary>
    ///     设置单元格的列表数据验证。
    /// </summary>
    /// <param name="list">有效值列表，中间使用逗号分割</param>
    IExcelRangeOperator SetListValidation(string list);

    /// <summary>
    /// 设置一个小于等于整数的有效值验证
    /// </summary>
    /// <param name="upperBound">最大值</param>
    IExcelRangeOperator SetIntegerLessEqualValidation(int upperBound);

    /// <summary>
    /// 设置一个大于等于整数的有效值验证
    /// </summary>
    /// <param name="lowerBound">最小值</param>
    IExcelRangeOperator SetIntegerGreaterEqualValidation(int lowerBound);

    /// <summary>
    /// 设置一个整数区间的有效值验证
    /// </summary>
    /// <param name="lowerBound">区间下限</param>
    /// <param name="upperBound">区间上限</param>
    IExcelRangeOperator SetIntegerBetweenValidation(int lowerBound, int upperBound);

    /// <summary>
    ///     获取指定行列偏移行、列数量的单元格。
    /// </summary>
    /// <param name="rowOffset">行偏移量</param>
    /// <param name="columnOffset">列偏移量</param>
    /// <returns></returns>
    IExcelRangeOperator Offset(int rowOffset, int columnOffset);
}